package xwc.usertree;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import java.io.Closeable;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

// AccountTree的快照
public class TreeSnapshot {
    private final AccountTree tree;

    // 目前简单用json做全量快照，之后要改成内存事务或者COW
    private final JSONObject rootNodeJSON;

    // TODO: 回滚时用以下信息回滚，而不是用性能较差的json
    private List<Account> newAccounts = new ArrayList<>(); // 快照后新增加的账户节点
    private Map<String, Account> updatedAccountsOldInfoMap = new HashMap<>(); // 快照后修改了的账户的旧信息。只有基本信息，层级关系只有新增没有修改和删除

    public TreeSnapshot(AccountTree tree) {
        this.tree = tree;
        Account rootNode = this.tree.getRootNode();
        rootNodeJSON = (JSONObject) JSON.toJSON(rootNode);
    }

    public JSONObject getRootNodeJSON() {
        return rootNodeJSON;
    }

    public void addNewAccount(Account account) {
        if(!newAccounts.contains(account)) {
            newAccounts.add(account);
        }
    }

    public void addAccountChanged(Account oldAccount) {
        if(oldAccount.isSystem()) {
            return; // 根节点不会修改
        }
        if(updatedAccountsOldInfoMap.containsKey(oldAccount.getKey())) {
            return; // 这个节点的快照数据已经记录过了
        }
        Account accountCopy = oldAccount.softCopy();
        updatedAccountsOldInfoMap.put(accountCopy.getKey(), accountCopy);
    }

    public void close() {

    }
}
